package com.example.caorl.jdbcaop.handler.impl;


import com.example.caorl.jdbcaop.handler.IResultSetHandler;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.sql.ResultSet;

//返回结果为一个JavaBean(domain),也就是一个列的结果
//将读取到的结果集读取出来，再用反射调用Javabean的setter方法将属性值添加进去
//这里的T是将JavaBean的类型传进去，如Student
public class BeanHandler<T> implements IResultSetHandler<T> {
	
	private Class<T> clz;
	//用来存放一列数据（JavaBean）的类型,告诉程序该以和中类型存储JavaBean
	
	public BeanHandler(Class<T> clz){
		this.clz=clz;
	}

	//将读取到的结果集存放到JavaBean当中
	public T handle(ResultSet rs) throws Exception {
		T obj=null;
		if(rs.next()){
			obj=clz.newInstance();//根据传进来的类型创建一个实例，也就是JavaBean的一个对象
			//通过自省，BeanIfo得到JavaBean的属性描述器
			PropertyDescriptor[] pds=Introspector.getBeanInfo(clz, Object.class)
					.getPropertyDescriptors();
			for (PropertyDescriptor p : pds) {//遍历描述器，获取所有的属性，并设置到JavaBean中
				String name=p.getName();//每一列的名字
				Object value=rs.getObject(name);
				//!!!获取到列的名字之后,调用结果集的get方法获取值
				p.getWriteMethod().invoke(obj,value);
				//反射调用set方法将值传进JavaBean对象obj中
			}
		}
		return obj;
	}

}
